package com.cs.beneficios.web.action;

import com.cs.beneficios.business.entity.AtributosDAO;
import com.cs.beneficios.business.entity.BeneficioDAO;
import com.cs.beneficios.business.entity.RenovarDAO;
import com.cs.beneficios.business.entity.SubProgramaDAO;
//import com.cs.beneficios.business.model.BeneficiarioVO;
import com.cs.beneficios.business.model.Beneficiario_AtributoVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.cs.paoyer.administration.business.model.UserVO;
import java.io.IOException;

import java.sql.SQLException;

import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class BeneficioOtorgAction extends Action {
	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		// ConnectionFactory cf = new
		// ConnectionFactory("beneficios","beneficios");
		ConnectionFactory cf = new ConnectionFactory();
		HttpSession session = request.getSession();
		// Proceso para la auditoria
		UserVO user = (UserVO) request.getSession().getAttribute("userInfo");
		String terminalAddress = request.getRemoteAddr();
		String strTerminal = ("WEB=" + terminalAddress);
		Calendar c = Calendar.getInstance();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		// Fin del proceso

		String strCodSub = (String) session.getAttribute("CodigoSubpro");
		String strOrigen = (String) session.getAttribute("renovacion");
		List lInsert = new LinkedList();
		String strTercero = "";
		String strCodeAtriDate = null;
		String strPosition = null;
		boolean disponibilidad = true;
		boolean existe = false;
		try {
			// proceso para identificar si el beneficiario ya tiene el beneficio
			// por primera vez
			if (strOrigen.equals("nuevo")) {
				String strCodigoBeneficiario = (String) session
						.getAttribute("beneficiario");
				BeneficioDAO objbeneDAO = new BeneficioDAO(cf);
				existe = objbeneDAO.GetExisteBeneficiario(
						strCodigoBeneficiario, strCodSub);
				cf.closeConnection(objbeneDAO.getConn());
			}
			// fin proceso
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		}

		if (!existe) {

			String strBeneficiario = (String) session
					.getAttribute("beneficiario");
			String strCodigoSubpro = (String) session
					.getAttribute("CodigoSubpro");
			String strCodigoSede = (String) session.getAttribute("CodigoSede");
			String strCostBenefit = (String) session
					.getAttribute("CostBenefit");
			String strDateBenefit = (String) session
					.getAttribute("DateBenefit");
			// Adicion tipo beneficio
			String strTypeBenefit = (String) session
					.getAttribute("TipoBenefit");
			if ((Object) strCodigoSede == null)
				strCodigoSede = request.getParameter("code");
			Object obTercero = (Object) session.getAttribute("listatercero");
			Object obListaInsert = (Object) session
					.getAttribute("listainsetar");

			SubProgramaDAO objSubProgramaDAO;
			AtributosDAO objAtributoDAO;
			String CodMaxBenefOtor = "";

			if (obTercero == null) {
				lInsert = (List) session.getAttribute("listainsetar");
			} else {
				lInsert = (List) session.getAttribute("listatercero");
				strTercero = (String) session.getAttribute("Tercero");
			}

			if (obListaInsert != null) {
				try {
					BeneficioDAO objBeneDAO = new BeneficioDAO(cf);
					Long loCodigoSede = new Long(strCodigoSede);
					Long loCodigoSubp = new Long(strCodigoSubpro);
					Long loCodigoBenefi = new Long(strBeneficiario);
					objSubProgramaDAO = new SubProgramaDAO(cf);
					// Proceso para saber los dias de reutilizacion y los dias a
					// renovar
					SubProgramaVO objsubproVO = new SubProgramaVO();
					objsubproVO = objSubProgramaDAO
							.GetPropiedadesSubpro(loCodigoSubp);
					cf.closeConnection(objSubProgramaDAO.getConn());
					String reutilizar = objsubproVO.getDiasReutilizar();
					// String renovacion = objsubproVO.getDiasRenovacion();
					int dreutilizar = Integer.parseInt(reutilizar.trim());
					// int drenovacion = Integer.parseInt(renovacion.trim());
					// if(dreutilizar <= 0) dreutilizar = 1;
					// double total = drenovacion/dreutilizar;
					long totaldias = 1;
					// Fin del proceso

					// Proceso para determinar si hay beneficios
					int disponible = objBeneDAO.GetDisponibilidad(
							strCodigoSede, strCodigoSubpro);
					if (totaldias > disponible) {
						disponibilidad = false;
					}
					// Fin del proceso

					if (disponibilidad) {
						// Proceso para traer los datos del beneficiario

						// Fin del proceso

						// Proceso para desabilitar los beneficios otorgados
						// anteriores
						RenovarDAO objrenovar = new RenovarDAO(cf);
						objrenovar.GetBeneOtorDesabilitar(strCodigoSubpro,
								strBeneficiario, strCodigoSede);
						cf.closeConnection(objrenovar.getConn());
						// fin del proceso

						// Proceso para identificar si el beneficio tiene el
						// atributo EDAD
						for (int i = 0; i < lInsert.size(); i++) {
							Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO) lInsert
									.get(i);
							AtributosDAO objAtributosDAO = new AtributosDAO(cf);
							String strNameAtri = objAtributosDAO
									.GetNameAtri(objBenefiVO
											.getCodigoatributo());
							cf.closeConnection(objAtributosDAO.getConn());
							if (strNameAtri != null && !strNameAtri.equals("")) {
								if (strNameAtri.equals("EDAD")) {
									strCodeAtriDate = objBenefiVO
											.getCodigoatributo();
									strPosition = String.valueOf(i);
									break;
								}
							}
						}
						// Fin del proceso
						// Proceso para insertar en beneficio otorgado
						int d = 0;
						String strArrIns[] = { user.getName(), strTerminal };

						// for(int i=0;i<totaldias;i++)
						// {
						// boolean insertbien =
						// objBeneDAO.OtorgarBeneficios(loCodigoSede,
						// loCodigoSubp,loCodigoBenefi, lInsert,
						// strTercero,d,strArrIns,strCostBenefit,strDateBenefit);
						boolean insertbien = objBeneDAO.OtorgarBeneficios(
								loCodigoSede, loCodigoSubp, loCodigoBenefi,
								lInsert, strTercero, d, strArrIns,
								strCostBenefit, strDateBenefit, strTypeBenefit);
						// d+=dreutilizar;
						if (strCodeAtriDate != null
								&& !strCodeAtriDate.equals("") && insertbien)// No
																				// deberia
																				// de
																				// llevar
																				// insertbien-Claudia
						{
							AtributosDAO objAtriDAO = new AtributosDAO(cf);
							String strDate = objAtriDAO.GetDateBeneficio(String
									.valueOf(d));
							cf.closeConnection(objAtriDAO.getConn());
							String strDateBirth = (String) session
									.getAttribute("DateBirth");
							int iEdad = 0;
							if (strDateBirth != null) {
								// Proceso para calcular la edad al momento de
								// otorgar el otro beneficio

								String ArrFechaActual[] = strDate.split("/");
								String strDayAc = ArrFechaActual[0];
								String strMonthAc = ArrFechaActual[1];
								String strYearAc = ArrFechaActual[2];

								String ArrFechaNacimiento[] = strDateBirth
										.split("/");
								String strDayNa = ArrFechaNacimiento[0];
								String strMonthNa = ArrFechaNacimiento[1];
								String strYearNa = ArrFechaNacimiento[2];

								// resto los anios de las dos fechas
								iEdad = Integer.parseInt(strYearAc)
										- Integer.parseInt(strYearNa) - 1; // -1
																			// porque
																			// no
																			// se
																			// si
																			// ha
																			// cumplido
																			// anios
																			// ya
																			// este
																			// anio

								// si resto los meses y me da menor que 0
								// entonces no ha cumplido anios. Si da mayor
								// si ha cumplido
								if (((Integer.parseInt(strMonthAc)) - (Integer
										.parseInt(strMonthNa))) > 0)
									iEdad += 1;

								if (((Integer.parseInt(strMonthAc)) - (Integer
										.parseInt(strMonthNa))) == 0) {
									// si resto los dias y me da menor que 0
									// entonces no ha cumplido anios. Si da
									// mayor o igual si ha cumplido
									if (((Integer.parseInt(strDayAc)) - (Integer
											.parseInt(strDayNa))) >= 0)
										iEdad += 1;
								}

								// Fin del Proceso
							} else {
								iEdad = 0;
							}

							// Proceso para asignar el nuevo valor
							Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO) lInsert
									.get(Integer.parseInt(strPosition));
							objBenefiVO.setVariable(String.valueOf(iEdad));
							objBenefiVO.setTipodato(objBenefiVO.getTipodato());
							objBenefiVO.setCodigoatributo(objBenefiVO
									.getCodigoatributo());
							objBenefiVO.setCodbeneficiario(objBenefiVO
									.getCodbeneficiario());
							objBenefiVO.setCodbeneotorgado(objBenefiVO
									.getCodbeneotorgado());
							objBenefiVO.setTipoatributo(objBenefiVO
									.getTipoatributo());

							lInsert.remove((Integer.parseInt(strPosition)));
							strPosition = String.valueOf(lInsert.size());
							lInsert.add(objBenefiVO);
							// Fin del proceso
						}

						/*
						 * if(!insertbien){ session.setAttribute("msgdis",
						 * "No hay beneficios disponibles en la sede seleccionada o puede que la sede no este vigente"
						 * ); }
						 */

						// }
						session.setAttribute("msg", "1");
					} else {
						session.setAttribute("msgdis",
								"No hay beneficios disponibles en la sede seleccionada.");
					}
					cf.closeConnection(objBeneDAO.getConn());

				} catch (Exception e) {
					System.err.println("/******** TDSUB - cwsub");
					e.printStackTrace();
					System.err.println("TDSUB - cwsub ********/");
				}
			}

		} else {
			session.setAttribute("msg", "2");
		}
		return mapping.findForward("success");
	}

}